package com.googlecode.horncomb.organ.srvc;

import java.util.Collection;
import java.util.List;

import com.googlecode.horncomb.organ.Membership;

public interface MembershipService {
	// -----------------------------------------------------------
	// create
	/**
	 * 创建关系
	 * @param relation
	 */
	public void create(Membership membership);

	// -----------------------------------------------------------
	// removeForGroup

	/**
	 * 删除组织人员关系.
	 * @param groupId
	 *            组织Id.
	 * @param personNatures
	 *            目标组织类型. 可为空，标识所有类型。
	 * @param membershipNatures
	 *            关系类型.
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除,或者只是置为无效.
	 */
	public void removeInGroup(String groupId, String[] personNatures,
			String[] membershipNatures, boolean deleted);

	/**
	 * 删除组织人员关系.
	 * @param groupIds
	 *            组织Id.
	 * @param personNatures
	 *            目标组织类型. 可为空，标识所有类型。
	 * @param membershipNatures
	 *            关系类型.
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除,或者只是置为无效.
	 */
	public void removeInGroups(Collection<String> groupIds,
			String[] personNatures, String[] membershipNatures, boolean deleted);

	// -----------------------------------------------------------
	// removeToPerson

	/**
	 * 删除组织人员关系.
	 * @param personId
	 *            人员Id.
	 * @param groupNatures
	 *            目标组织类型. 可为空，标识所有类型。
	 * @param membershipNatures
	 *            关系类型.
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除,或者只是置为无效.
	 */
	public void removeToPerson(String personId, String[] groupNatures,
			String[] membershipNatures, boolean deleted);

	/**
	 * 删除组织人员关系.
	 * @param personIds
	 *            人员Id.
	 * @param groupNatures
	 *            目标组织类型. 可为空，标识所有类型。
	 * @param membershipNatures
	 *            关系类型.
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除,或者只是置为无效.
	 */
	public void removeToPersons(Collection<String> personIds,
			String[] groupNatures, String[] membershipNatures, boolean deleted);

	// -----------------------------------------------------------
	// removeBetween
	/**
	 * 删除组织人员关系.
	 * @param groupIds
	 *            组织Id.
	 * @param personId
	 *            人员Id.
	 * @param membershipNatures
	 *            关系类型.
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除,或者只是置为无效.
	 */
	public void removeBetween(Collection<String> groupIds, String personId,
			String[] membershipNatures, boolean deleted);

	/**
	 * 删除组织人员关系.
	 * @param groupId
	 *            组织Id.
	 * @param personIds
	 *            人员Id.
	 * @param membershipNatures
	 *            关系类型.
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除,或者只是置为无效.
	 */
	public void removeBetween(String groupId, Collection<String> personIds,
			String[] membershipNatures, boolean deleted);

	/**
	 * 删除组织人员关系.
	 * @param groupId
	 *            组织Id.
	 * @param personId
	 *            人员Id.
	 * @param membershipNatures
	 *            关系类型.
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除,或者只是置为无效.
	 */
	public void removeBetween(String groupId, String personId,
			String[] membershipNatures, boolean deleted);

	// -----------------------------------------------------------
	// removeById

	/**
	 * 删除组织人员关系.
	 * @param membershipId
	 *            关系Id.
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除,或者只是置为无效.
	 */
	public void removeById(String membershipId, boolean deleted);

	/**
	 * 删除组织人员关系.
	 * @param membershipIds
	 *            关系Id.
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除,或者只是置为无效.
	 */
	public void removeByIds(Collection<String> membershipIds, boolean deleted);

	// -----------------------------------------------------------
	// findMemberships

	/**
	 * 查询成员关系.
	 * @param groupIds
	 *            组织Id.
	 * @param personId
	 *            人员Id.
	 * @param membershipNatures
	 *            成员关系类型.
	 * @return 成员关系列表.
	 */
	public List<? extends Membership> findMemberships(
			Collection<String> groupIds, String personId,
			String[] membershipNatures);

	/**
	 * 查询成员关系.
	 * @param groupId
	 *            组织Id.
	 * @param personIds
	 *            人员Id.
	 * @param membershipNatures
	 *            成员关系类型.
	 * @return 成员关系列表.
	 */
	public List<? extends Membership> findMemberships(String groupId,
			Collection<String> personIds, String[] membershipNatures);

	/**
	 * 查询成员关系.
	 * @param groupId
	 *            组织Id.
	 * @param personId
	 *            人员Id.
	 * @param membershipNatures
	 *            成员关系类型.
	 * @return 成员关系列表.
	 */
	public List<? extends Membership> findMemberships(String groupId,
			String personId, String[] membershipNatures);

	// -----------------------------------------------------------
	// get
	/**
	 * 获取成员关系.
	 * @param groupId
	 *            组织Id.
	 * @param personId
	 *            人员Id.
	 * @param membershipNature
	 *            成员关系类型.
	 * @return 成员关系.
	 */
	public Membership get(String groupId, String personId, String membershipNature);

	/**
	 * 根据Id获取成员关系.
	 * @param id
	 *            关系Id.
	 * @return 成员关系.
	 */
	public Membership getById(String id);
}
